package api

import (
	"aigen-todo/internal/service"
	"strconv"

	"github.com/gofiber/fiber/v2"
)

// CreateTaskGroupRequest defines the structure for creating a task group
type CreateTaskGroupRequest struct {
	// Name of the task group
	// required: true
	// example: 工作任务
	Name string `json:"name" binding:"required"`
}

// UpdateTaskGroupRequest defines the structure for updating a task group
type UpdateTaskGroupRequest struct {
	// Name of the task group
	// required: true
	// example: 个人任务
	Name string `json:"name" binding:"required"`
}

// TaskGroupData defines the data structure for a task group
type TaskGroupData struct {
	GroupID   uint64 `json:"group_id"`
	Name      string `json:"name"`
	CreatedAt string `json:"created_at,omitempty"`
	UpdatedAt string `json:"updated_at,omitempty"`
}

// TaskGroupListItem defines the structure for a task group item in list
type TaskGroupListItem struct {
	GroupID   uint64 `json:"group_id"`
	Name      string `json:"name"`
	IsDefault bool   `json:"is_default"`
	TaskCount int    `json:"task_count"`
	CreatedAt string `json:"created_at"`
}

// CreateTaskGroupHandler godoc
// @Summary      创建任务分组
// @Description  创建一个新的任务分组
// @Tags         任务分组
// @Accept       json
// @Produce      json
// @Param        Authorization header string true "Bearer Token"
// @Param        createTaskGroupReq body CreateTaskGroupRequest true "创建任务分组请求"
// @Success      200  {object}  TaskGroupResponse
// @Failure      400  {object}  TaskGroupResponse
// @Failure      401  {object}  TaskGroupResponse
// @Failure      500  {object}  TaskGroupResponse
// @Router       /task-groups [post]
func CreateTaskGroupHandler(taskGroupService *service.TaskGroupService) fiber.Handler {
	return func(c *fiber.Ctx) error {
		userID, exists := c.Locals("user_id").(uint64)
		if !exists {
			return Unauthorized(c) // 使用默认错误消息
		}

		var req CreateTaskGroupRequest
		if err := c.BodyParser(&req); err != nil {
			return BadRequest(c) // 使用默认错误消息
		}

		group, err := taskGroupService.CreateTaskGroup(userID, req.Name)
		if err != nil {
			return InternalServerError(c) // 使用默认错误消息
		}

		data := map[string]interface{}{
			"group_id":   group.ID,
			"name":       group.Name,
			"created_at": group.CreatedAt,
		}
		return SuccessWithMessage(c, "创建成功", data)
	}
}

// GetTaskGroupsHandler godoc
// @Summary      获取任务分组列表
// @Description  获取当前用户的所有任务分组
// @Tags         任务分组
// @Accept       json
// @Produce      json
// @Param        Authorization header string true "Bearer Token"
// @Success      200  {object}  TaskGroupListResponse
// @Failure      401  {object}  TaskGroupListResponse
// @Failure      500  {object}  TaskGroupListResponse
// @Router       /task-groups [get]
func GetTaskGroupsHandler(taskGroupService *service.TaskGroupService) fiber.Handler {
	return func(c *fiber.Ctx) error {
		userID, exists := c.Locals("user_id").(uint64)
		if !exists {
			return Unauthorized(c) // 使用默认错误消息
		}

		groups, err := taskGroupService.GetTaskGroupsByUserID(userID)
		if err != nil {
			return InternalServerError(c) // 使用默认错误消息
		}

		// 转换为响应格式
		groupList := make([]map[string]interface{}, len(groups))
		for i, group := range groups {
			// 获取该分组下的任务数量
			// 这里简化处理，实际应该通过任务服务获取
			taskCount := 0

			groupList[i] = map[string]interface{}{
				"group_id":   group.ID,
				"name":       group.Name,
				"is_default": group.IsDefault,
				"task_count": taskCount,
				"created_at": group.CreatedAt,
			}
		}

		data := map[string]interface{}{
			"list": groupList,
		}
		return SuccessWithMessage(c, "获取成功", data)
	}
}

// UpdateTaskGroupHandler godoc
// @Summary      更新任务分组
// @Description  更新指定的任务分组信息
// @Tags         任务分组
// @Accept       json
// @Produce      json
// @Param        Authorization header string true "Bearer Token"
// @Param        id path int true "任务分组ID"
// @Param        updateTaskGroupReq body UpdateTaskGroupRequest true "更新任务分组请求"
// @Success      200  {object}  TaskGroupResponse
// @Failure      400  {object}  TaskGroupResponse
// @Failure      401  {object}  TaskGroupResponse
// @Failure      403  {object}  TaskGroupResponse
// @Failure      404  {object}  TaskGroupResponse
// @Failure      500  {object}  TaskGroupResponse
// @Router       /task-groups/{id} [put]
func UpdateTaskGroupHandler(taskGroupService *service.TaskGroupService) fiber.Handler {
	return func(c *fiber.Ctx) error {
		userID, exists := c.Locals("user_id").(uint64)
		if !exists {
			return Unauthorized(c) // 使用默认错误消息
		}

		// 获取分组ID
		groupID, err := strconv.ParseUint(c.Params("id"), 10, 64)
		if err != nil {
			return BadRequest(c) // 使用默认错误消息
		}

		var req UpdateTaskGroupRequest
		if err := c.BodyParser(&req); err != nil {
			return BadRequest(c) // 使用默认错误消息
		}

		// 获取分组信息
		group, err := taskGroupService.GetTaskGroupByID(groupID)
		if err != nil {
			return NotFound(c) // 使用默认错误消息
		}

		// 检查分组是否属于当前用户
		if group.UserID != userID {
			return Forbidden(c) // 使用默认错误消息
		}

		// 更新分组
		group.Name = req.Name
		err = taskGroupService.UpdateTaskGroup(group)
		if err != nil {
			return InternalServerError(c) // 使用默认错误消息
		}

		data := map[string]interface{}{
			"group_id":   group.ID,
			"name":       group.Name,
			"updated_at": group.UpdatedAt,
		}
		return SuccessWithMessage(c, "更新成功", data)
	}
}

// DeleteTaskGroupHandler godoc
// @Summary      删除任务分组
// @Description  删除指定的任务分组
// @Tags         任务分组
// @Accept       json
// @Produce      json
// @Param        Authorization header string true "Bearer Token"
// @Param        id path int true "任务分组ID"
// @Success      200  {object}  TaskGroupResponse
// @Failure      400  {object}  TaskGroupResponse
// @Failure      401  {object}  TaskGroupResponse
// @Failure      403  {object}  TaskGroupResponse
// @Failure      404  {object}  TaskGroupResponse
// @Failure      500  {object}  TaskGroupResponse
// @Router       /task-groups/{id} [delete]
func DeleteTaskGroupHandler(taskGroupService *service.TaskGroupService) fiber.Handler {
	return func(c *fiber.Ctx) error {
		userID, exists := c.Locals("user_id").(uint64)
		if !exists {
			return Unauthorized(c) // 使用默认错误消息
		}

		// 获取分组ID
		groupID, err := strconv.ParseUint(c.Params("id"), 10, 64)
		if err != nil {
			return BadRequest(c) // 使用默认错误消息
		}

		// 获取分组信息
		group, err := taskGroupService.GetTaskGroupByID(groupID)
		if err != nil {
			return NotFound(c) // 使用默认错误消息
		}

		// 检查分组是否属于当前用户
		if group.UserID != userID {
			return Forbidden(c) // 使用默认错误消息
		}

		// 检查是否为默认分组
		if group.IsDefault {
			return BadRequest(c, "不能删除默认分组") // 自定义错误消息
		}

		// 删除分组
		err = taskGroupService.DeleteTaskGroup(groupID)
		if err != nil {
			return InternalServerError(c) // 使用默认错误消息
		}

		return SuccessWithMessage(c, "删除成功", nil)
	}
}
